package com.shijie.sjoj.model.component.validate;

import com.shijie.sjoj.model.utils.StringUtils;

import java.util.regex.Pattern;

/**
 * 正则表达式类型验证
 */
public class RegexValidate {

    /**
     * 系统的账号正则表达式：只能以字母、数字及特殊字符@#_组成，开头不能为数字，长度3至30
     */
    public static final String SYS_REGEX_ACCOUNT = "^(?=\\D)[A-Za-z0-9@#&>_<]{3,30}$";

    /**
     * 系统的账号正则匹配模式
     */
    public static final Pattern SYS_PATTERN_ACCOUNT = Pattern.compile(SYS_REGEX_ACCOUNT);

    /**
     * 系统的密码正则表达式：至少包含一个字母和一个数字，特殊字符只允许@#&>_<，长度8至30
     */
    public static final String SYS_REGEX_PASSWORD = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d@#&>_<]{8,30}$";

    /**
     * 系统的密码正则匹配模式
     */
    public static final Pattern SYS_PATTERN_PASSWORD = Pattern.compile(SYS_REGEX_PASSWORD);

    /**
     * 中国+86手机号正则表达式
     */
    public static final String DEF_REGEX_PHONE = "^1[3-9]\\d{9}$";

    /**
     * 中国+86手机号正则匹配模式
     */
    public static final Pattern DEF_PATTERN_PHONE = Pattern.compile(DEF_REGEX_PHONE);

    /**
     * 严格的密码正则表达式：至少包含一个大字母、一个小写字母、一个数字和一个特殊字符@#&>_<，特殊字符只允许@#&>_<，长度8至30
     */
    public static final String STRICT_REGEX_PASSWORD = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[@#&>_<])[A-Za-z\\d@#&>_<]{10,30}$";

    /**
     * 严格的密码正则匹配模式
     */
    public static final Pattern STRICT_PATTERN_PASSWORD = Pattern.compile(STRICT_REGEX_PASSWORD);

    /**
     * 默认的无效值校验
     *
     * @param value 待校验值
     * @param regex 正则表达式
     * @return boolean
     */
    public static boolean invalid(String value, String regex) {
        return StringUtils.isBlank(value) || !Pattern.matches(regex, value);
    }

    /**
     * 系统账号的无效值校验
     *
     * @param account 待校验账号
     * @return boolean
     */
    public static boolean invalidSysAccount(String account) {
        return StringUtils.isBlank(account) || !SYS_PATTERN_ACCOUNT.matcher(account).matches();
    }

    /**
     * 系统密码的无效值校验
     *
     * @param password 待校验密码
     * @return boolean
     */
    public static boolean invalidSysPassword(String password) {
        return StringUtils.isBlank(password) || !SYS_PATTERN_PASSWORD.matcher(password).matches();
    }

    /**
     * 手机号的无效值校验
     *
     * @param phone 待校验手机号
     * @return boolean
     */
    public static boolean invalidDefPhone(String phone) {
        return StringUtils.isBlank(phone) || !DEF_PATTERN_PHONE.matcher(phone).matches();
    }

    /**
     * 严格的无效值校验
     *
     * @param value 待校验值
     * @return boolean
     */
    public static boolean invalidStrict(String value) {
        return StringUtils.isBlank(value) || !STRICT_PATTERN_PASSWORD.matcher(value).matches();
    }

    /**
     * 默认的有效值校验
     *
     * @param value 待校验值
     * @param regex 正则表达式
     * @return boolean
     */
    public static boolean valid(String value, String regex) {
        return !invalid(value, regex);
    }

    /**
     * 系统账号的有效值校验
     *
     * @param account 待校验账号
     * @return boolean
     */
    public static boolean validSysAccount(String account) {
        return !invalidSysAccount(account);
    }

    /**
     * 系统密码的有效值校验
     *
     * @param password 密码
     * @return boolean
     */
    public static boolean validSysPassword(String password) {
        return !invalidSysPassword(password);
    }

    /**
     * 手机号的有效值校验
     *
     * @param phone 待校验手机号
     * @return boolean
     */
    public static boolean validDefPhone(String phone) {
        return !invalidDefPhone(phone);
    }

    /**
     * 严格的有效值校验
     *
     * @param password 密码
     * @return boolean
     */
    public static boolean validStrict(String password) {
        return !invalidStrict(password);
    }


}
